package com.ky.serialport.sensor;

import com.ky.serialport.bean.ComBean;
import com.ky.serialport.utils.MyFunc;

import java.util.Random;

/**
 * 功率箱
 */

public class GongLvDataBean {

    public Long time = 0L;
    public int index = -1; //传感器序号
    public int type = 0; //传感器类型
    public ComBean comBean;
    public int power = 0; //电量
    public int signal = 0; //信号
    public float Uab = 0f; //A相电压
    public float Ubc = 0f; //B相电压
    public float Uca = 0f; //C相电压
    public float Ia = 0f; //A相电流
    public float Ib = 0f; //B相电流
    public float Ic = 0f; //C相电流
    public float U0 = 0f; //平均电压
    public float I0 = 0f; //平均电流
    public float P = 0f; //有功功率
    public float Q = 0f; //总无功功率
    public float cos = 0f;


    public GongLvDataBean() {
    }

    /**
     *
     * @param comBean
     * @param dybbF 电压变比
     * @param dlbbF 电流变比
     * @param qblch  钳表量程
     * @param cshffStr 测试方法 ： 单瓦特 双瓦特 三瓦特
     */
    public GongLvDataBean(ComBean comBean, float dybbF , float dlbbF , float qblch, String cshffStr) {
        caculate(comBean.recData,  dybbF ,  dlbbF ,  qblch,  cshffStr);
        time = comBean.recTime;
        this.comBean = comBean;
    }

    public GongLvDataBean(byte[] recData , float dybbF , float dlbbF , float qblch, String cshffStr) {
        caculate(recData, dybbF ,  dlbbF ,  qblch,  cshffStr);
        time = System.currentTimeMillis();
    }

    public GongLvDataBean caculate(byte[] bRec, float dybbF , float dlbbF , float qblch, String cshffStr) {

        index = bRec[10];
        type = bRec[9];
        float xishu = (float) qblch;

        time = System.currentTimeMillis();
        // （UA）： A相电压值。 实际值＝（UA）／10000*（U0）*（UBB） V
        // （UB）： B相电压值。 实际值＝（UB）／10000*（U0）*（UBB） V
        // （UC）： C相电压值。 实际值＝（UC）／10000*（U0）*（UBB） V
        // （IA）： A相电流值。 实际值＝（IA）／10000*（I0）*（IBB） A
        // （IB）： B相电流值。 实际值＝（IB）／10000*（I0）*（IBB） A
        // （IC）： C相电流值。 实际值＝（IC）／10000*（I0）*（IBB） A
        // （P）： 总有功功率值。 实际值＝ ±（P）／10000 *3*（U0）*（I0）*（UBB）*（IBB） W
        // （Q）： 总无功功率值。 实际值＝±（Q）／10000 *3*（U0）*（I0）*（UBB）*（IBB） Var

        Uab = (float) MyFunc.twoByte2IntNoSign(bRec[14], bRec[15]) / 10000f * 500f * 1.732f * dybbF;
        Ubc = (float) MyFunc.twoByte2IntNoSign(bRec[18], bRec[19]) / 10000f * 500f * 1.732f * dybbF;
        Uca = (float) MyFunc.twoByte2IntNoSign(bRec[22], bRec[23]) / 10000f * 500f * 1.732f * dybbF;

//        钳表量程  500A 为500  10A 为100
        Ia = ((float) MyFunc.twoByte2IntNoSign(bRec[16], bRec[17])) / 10000f * xishu * dlbbF;
        Ib = ((float) MyFunc.twoByte2IntNoSign(bRec[20], bRec[21])) / 10000f * xishu * dlbbF;
        Ic = ((float) MyFunc.twoByte2IntNoSign(bRec[24], bRec[25])) / 10000f * xishu * dlbbF;
        U0 = (Uab + Ubc + Uca) / 3f;
        I0 = (Ia + Ib + Ic) / 3f;
        cos = ((float) MyFunc.twoBytes2IntSign(bRec[30], bRec[31]) / 10000f);
        Q = 0f;            //总无功功率
        P = 0f;            //有功功率

        //单瓦测试
        if (cshffStr.equals("单瓦特")) {
            Ubc = 0f;
            Uca = 0f;
            Ib = 0f;
            Ic = 0f;
            U0 = Uab;
            I0 = Ia;
            if (Uab / (Math.sqrt(3) * dybbF) > 150) {
                P = MyFunc.twoBytes2IntSign(bRec[26], bRec[27]) / 10000000f * 3f * 500f * xishu * dybbF * dlbbF * 3f;
                Q = (float) MyFunc.twoBytes2IntSign(bRec[28], bRec[29]) / 10000000f * 3f * 500f * xishu * dybbF * dlbbF;
            } else {
                P = (float) (Math.sqrt(3) * Uab * Ia * cos / 1000f);
                Q = 1.732f * Uab * Ia * (float) Math.sqrt(1 - cos * cos) / 1000f;
            }
        } else {
            if (((Uab + Ubc + Uca) / 3) / (Math.sqrt(3) * dybbF) > 150) {
                P = MyFunc.twoBytes2IntSign(bRec[26], bRec[27]) / 10000000f * 3f * 500f * xishu * dybbF * dlbbF;
                Q = (float) MyFunc.twoBytes2IntSign(bRec[28], bRec[29]) / 10000000f * 3f * 500f * xishu * dybbF * dlbbF;
            } else {
                P = (float) (Math.sqrt(3) * U0 * I0 * cos / 1000f);
                Q = 1.732f * U0 * I0 * (float) Math.sqrt(1 - cos * cos) / 1000f;
            }
            //------------------
        }
        signal = MyFunc.getSignal(bRec[34]);;
        power = MyFunc.getPower(bRec[32], bRec[33])/2;
        return this;
    }

    public GongLvDataBean  test(){
        Random random = new Random();
        this.power = random.nextInt(700);
        this.signal = random.nextInt(100);
        this.Uab = random.nextInt(10)+200;
        this.Ubc = random.nextInt(10)+200;
        this.Uca = random.nextInt(10)+200;
        this.Ia = random.nextInt(5)+10;
        this.Ib = random.nextInt(5)+10;
        this.Ic = random.nextInt(5)+10;
        this.U0 = random.nextInt(200)+10;
        this.I0 = random.nextInt(5)+10;
        this.P = random.nextInt(100)+200;
        this.Q = random.nextInt(100)+200;
        this.cos = random.nextInt(10)/10f;
        return this;
    }

}
